# 感知机实现简单的逻辑电路

"""
1. 感知机就是x1w1+x2w2与b相比较的过程，其中x1,x2为输入特征，w1,w2为权重，b为偏置（阈值）。
2. 如果x1w1+x2w2>b，则输出1，否则输出0。
3. 训练过程就是通过不断调整权重w1,w2和偏置b，使得感知机的输出与样本的真实输出一致。
"""


# 1.与门等简单逻辑电路，按照同样的逻辑就可以实现人工的感知机。
def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    temp = x1 * w1 + x2 * w2
    if temp > theta:
        return 1
    elif temp <= theta:
        return 0


# 2. 偏置b形式下的感知机实现与门
import numpy as np

def AND_(x1,x2):
    """
    如果x1w1+x2w2+b>0，则输出1，否则输出0。
    :param x1:
    :param x2:
    :return:
    """
    # 在NumPy数组的乘法运算中，当两个数组的元素个数相同时，各个元素分别相乘
    x = np.array([0, 1])  # 输入
    w = np.array([0.5, 0.5])  # 权重
    b = -0.7
    print(w * x)  # [0. , 0.5]
    print(np.sum(w * x))  # 把一维数组里面的所有值加起来
    print(np.sum(w * x) + b)  # 加上偏置,偏置是用来调整神经元被激活的容易程度（输出信号为1的程度）的参数

    temp = np.sum(x*w) + b
    if temp <=0:
        return 0
    elif temp >0:
        return 1

# 与非门
def NAND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([-0.5, -0.5])
    b = 0.7
    temp = np.sum(x*w) + b
    if temp <= 0:
        return 0
    elif temp > 0:
        return 1

# 或门
def OR(x1,x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.2
    temp = np.sum(x*w) + b
    if temp <= 0:
        return 0
    elif temp > 0:
        return 1

def XOR(x1,x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y
print(XOR(0,1))